#ifndef MANEJADOR_BITS_H
#define MANEJADOR_BITS_H

#include <stdbool.h>
#include <stdio.h>
#include "vector_binario.h"

/* *********************************************************************
 *					 DEFINICION DE LOS TIPOS DE DATOS				   *
 * *********************************************************************/

typedef struct _manejador_bits ManejadorBits_t;

/* *********************************************************************
 *					  PRIMITIVAS DEL MANEJADOR BITS					   *
 * *********************************************************************/

/* Crea el manejador de archivos en bits. Devuelve NULL en caso de error. */
ManejadorBits_t* ManejadorBits_crear (char* ruta, bool escrituraParametro);

/* Devuelve true si el buffer está vacío, false en cualquier otro caso. */
bool ManejadorBits_buffer_esta_vacio (ManejadorBits_t* manejador);

/* Devuelve true si el buffer está lleno, false en cualquier otro caso. */
bool ManejadorBits_buffer_esta_lleno (ManejadorBits_t* manejador);

/* Escribe el número en el archivo. Devuelve false en caso de error. */
bool ManejadorBits_escribir_numero (ManejadorBits_t* manejador, vector_binario_t* numero);

/* Escribe la cadena en el archivo. Devuelve false en caso de error. */
bool ManejadorBits_escribir_cadena (ManejadorBits_t* manejador, char* cadena);


char* ManejadorBits_leer_cadena (ManejadorBits_t* manejador, long largo);

/* Devuelve true si el manejador fue creado en modo escritura, false
 * en cualquier otro caso. */
bool ManejadorBits_es_modo_escritura (ManejadorBits_t* manejador);

/* Hace una lectura del disco y carga la información en el buffer.
 * Devuelve false en caso de error. */
bool ManejadorBits_cargar_buffer (ManejadorBits_t* manejador);

/* Posiciona el file handler en 'posicion' (expresado en bits). El manejador
 * debe estar en formato lectura. Devuelve false en caso de error. */
bool ManejadorBits_seek (ManejadorBits_t* manejador, long int posicion);

/* Devuelve la cantidad de bits ocupados en el buffer o -1 en caso de error. */
int ManejadorBits_bits_ocupados (ManejadorBits_t* manejador);

/* Ocupa la cantidad de bits del buffer indicado por el parámetro.
 * Devuelve false en caso de error. */
bool ManejadorBits_ocuparBits (ManejadorBits_t* manejador, int bits);

/* Devuelve el buffer en formato char. Devuelve 0 en caso de error.
 * Se debe utilizar la primitiva ".._buffer_esta_vacio" para distinguir
 * entre un buffer vacío y un error al ver el buffer. */
char ManejadorBits_ver_buffer (ManejadorBits_t* manejador);

/* Destruye el manejador, previo relleno (si se está en el modo escritura
 * y cierre del archivo. */
void ManejadorBits_destruir (ManejadorBits_t* manejador);


#endif //MANEJADOR_BITS_H
